// yyyy-MM-dd hh:mm:ss.SSS 所有支持的类型
function pad(str, length = 2) {
		str += ''
		while (str.length < length) {
			str = '0' + str
		}
		return str.slice(-length)
	}
module.exports = {

	parser: {
		yyyy: (dateObj) => {
			return pad(dateObj.year, 4)
		},
		yy: (dateObj) => {
			return pad(dateObj.year)
		},
		MM: (dateObj) => {
			return pad(dateObj.month)
		},
		M: (dateObj) => {
			return dateObj.month
		},
		dd: (dateObj) => {
			return pad(dateObj.day)
		},
		d: (dateObj) => {
			return dateObj.day
		},
		hh: (dateObj) => {
			return pad(dateObj.hour)
		},
		h: (dateObj) => {
			return dateObj.hour
		},
		mm: (dateObj) => {
			return pad(dateObj.minute)
		},
		m: (dateObj) => {
			return dateObj.minute
		},
		ss: (dateObj) => {
			return pad(dateObj.second)
		},
		s: (dateObj) => {
			return dateObj.second
		},
		SSS: (dateObj) => {
			return pad(dateObj.millisecond, 3)
		},
		S: (dateObj) => {
			return dateObj.millisecond
		},
	},

	// 这都n年了iOS依然不认识2020-12-12，需要转换为2020/12/12
	getDate: function(time) {
		if (time instanceof Date) {
			return time
		}
		switch (typeof time) {
			case 'string': {
				// 2020-12-12T12:12:12.000Z、2020-12-12T12:12:12.000
				if (time.indexOf('T') > -1) {
					return new Date(time)
				}
				return new Date(time.replace(/-/g, '/'))
			}
			default:
				return new Date(time)
		}
	},

	formatDate: function(date, format = 'yyyy/MM/dd hh:mm:ss') {
		var that=this
		if (!date && date !== 0) {
			return ''
		}
		date = this.getDate(date)
		const dateObj = {
			year: date.getFullYear(),
			month: date.getMonth() + 1,
			day: date.getDate(),
			hour: date.getHours(),
			minute: date.getMinutes(),
			second: date.getSeconds(),
			millisecond: date.getMilliseconds()
		}
		const tokenRegExp = /yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|SS|S/
		let flag = true
		let result = format
		while (flag) {
			flag = false
			result = result.replace(tokenRegExp, function(matched) {
				flag = true
				return that.parser[matched](dateObj)
			})
		}
		return result
	},

	friendlyDate: function(time) {
		var locale = 'zh',
		threshold = [60000, 3600000],
		format = 'yyyy/MM/dd hh:mm:ss'
		if (time === '-') {
			return time
		}
		if (!time && time !== 0) {
			return ''
		}
		const localeText = {
			zh: {
				year: '年',
				month: '月',
				day: '天',
				hour: '小时',
				minute: '分钟',
				second: '秒',
				ago: '前',
				later: '后',
				justNow: '刚刚',
				soon: '马上',
				template: '{num}{unit}{suffix}'
			},
			en: {
				year: 'year',
				month: 'month',
				day: 'day',
				hour: 'hour',
				minute: 'minute',
				second: 'second',
				ago: 'ago',
				later: 'later',
				justNow: 'just now',
				soon: 'soon',
				template: '{num} {unit} {suffix}'
			}
		}
		const text = localeText[locale] || localeText.zh
		let date = this.getDate(time)
		let ms = date.getTime() - Date.now()
		let absMs = Math.abs(ms)
		if (absMs < threshold[0]) {
			return ms < 0 ? text.justNow : text.soon
		}
		if (absMs >= threshold[1]) {
			return this.formatDate(date, format)
		}
		let num
		let unit
		let suffix = text.later
		if (ms < 0) {
			suffix = text.ago
			ms = -ms
		}
		const seconds = Math.floor((ms) / 1000)
		const minutes = Math.floor(seconds / 60)
		const hours = Math.floor(minutes / 60)
		const days = Math.floor(hours / 24)
		const months = Math.floor(days / 30)
		const years = Math.floor(months / 12)
		switch (true) {
			case years > 0:
				num = years
				unit = text.year
				break
			case months > 0:
				num = months
				unit = text.month
				break
			case days > 0:
				num = days
				unit = text.day
				break
			case hours > 0:
				num = hours
				unit = text.hour
				break
			case minutes > 0:
				num = minutes
				unit = text.minute
				break
			default:
				num = seconds
				unit = text.second
				break
		}

		if (locale === 'en') {
			if (num === 1) {
				num = 'a'
			} else {
				unit += 's'
			}
		}

		return text.template.replace(/{\s*num\s*}/g, num + '').replace(/{\s*unit\s*}/g, unit).replace(
			/{\s*suffix\s*}/g,
			suffix)
	}
}
